package dao

import (
	"gorm.io/gorm"
	"log"
	"time"
	"ztool/common"
	"ztool/dao/type"
	"ztool/models"
)

// Tag 标签
type Tag struct {
	ID        _type.SnowflakeId `json:"id" form:"id"`           //ID
	Content   string            `json:"content" form:"content"` //标签内容
	CreatedAt time.Time         `json:"created_at"`             //gorm自动填充
}

// AddTag 创建
func AddTag(tag *Tag) {
	log.Println("创建标签")
	db := common.GetDB()

	tag.ID = _type.GenerateSnowflakeId()

	db.Model(&Tag{}).Create(&tag)
}

// AddTags 批量添加
func AddTags(tags *[]Tag, tx *gorm.DB) error {
	log.Println("批量创建标签")

	//创建切片
	var addTags []*Tag

	for i := 0; i < len(*tags); i++ {
		tag := (*tags)[i]

		if tag.ID.SnowflakeIdIsEmpty() {
			rTag := Tag{
				ID:      _type.GenerateSnowflakeId(),
				Content: tag.Content,
			}
			addTags = append(addTags, &rTag)
			//重新给tag赋值
			(*tags)[i] = rTag
		}
	}

	if len(addTags) > 0 {
		log.Printf("新增 %d 个标签", len(addTags))
		//批量插入
		return tx.Create(&addTags).Error
	}

	log.Println("没有新增标签")
	return nil
}

// GetTagList 查询列表
func GetTagList(searchKey string) *[]Tag {
	db := common.GetDB()
	tags := []Tag{}

	d := db.Order("created_at desc")

	//如果有content参数, *代表全部
	if len(searchKey) > 0 && searchKey != "*" {
		d.Where("content like ?", "%"+searchKey+"%")
	}

	result := d.Find(&tags)
	if nil != result.Error {
		return nil
	}
	return &tags
}

// QueryTagPage 分页查询
func QueryTagPage(page int32) *models.Pages {
	db := common.GetDB()

	//转换页码
	page = page - 1

	//查询总数
	var rows int64
	db.Model(&Tag{}).Count(&rows)

	result := models.Pages{}

	//查询分页
	tags := []Tag{}
	db.Model(&Tag{}).Limit(int(common.PAGE_OFFSET)).Offset(int(common.PAGE_OFFSET * page)).Find(&tags)

	result.Total = rows
	result.PageOffset = common.PAGE_OFFSET
	result.Current = page
	result.Data = &tags

	return &result
}

// DelTag 删除
func DelTag(id *string) error {
	db := common.GetDB()

	db.Transaction(func(tx *gorm.DB) error {
		//1.删除标签
		if err := tx.Delete(&Tag{}, id).Error; err != nil {
			return err
		}

		//2.删除关系表
		if err := tx.Where("tag_id = ?", id).Delete(&VideoTags{}).Error; err != nil {
			return err
		}

		return nil
	})

	return nil
}

//UpdateTag 修改
func UpdateTag(tag *Tag) {
	db := common.GetDB()
	db.Model(&tag).Where("id = ?", tag.ID).Update("content", tag.Content)
}
